home *** CD-ROM | disk | FTP | other *** search
- /*==============================================================================
-
- FICHERO: TECLAS.C
-
- AUTOR: ANTONIO LADESA JURADO
-
- FECHA: 24/6/94
-
- DESCRIPCION:
-
- Fichero que contiene las estructuras, constantes, variables y funciones
- para el control de eventos y visualización de teclas, textos y mensajes.
-
- ==============================================================================*/
-
-
- /*---- MODULOS USADOS --------------------------------------------------------*/
-
- #include <stdio.h>
- #include <stdlib.h>
- #include <graphics.h>
- #include <ctype.h>
- #include <alloc.h>
- #include <string.h>
- #include <dir.h>
- #include <dos.h>
- #include <bios.h>
- #include <errno.h>
- #include <conio.h>
-
- #include "global.h"
- #include "raton.h"
- #include "error.h"
- #include "teclas.h"
-
- /*---- ESTRUCTURAS, CONSTANTES Y VARIABLES LOCALES AL MODULO -----------------*/
-
- /* estructura de acción */
- struct ACCION accion;
- /* evento a leer */
- struct EVENTO evento;
-
- /* marcos de los menus */
- struct TECLA m[NUM_MARCOS] =
- {
- /* titulo */
- { 0, 5,639, 30,OFF,""},
- /* mensajes */
- { 0,459,639, 20,OFF,""},
- /* cuadro directorio */
- { 0, 39,255,350,OFF,""},
- /* cuadro menu impresion */
- {260, 40,379,130,OFF,""},
- /* cuadro menu memoria */
- {260,170,379,54,OFF,""},
- /* cuadro menu escalado */
- {260,225,379,54,OFF,""},
- /* cuadro menu blanco y negro */
- {260,280,379,54,OFF,""},
- /* cuadro confirmar */
- {260,300,379,89,OFF,""},
- };
-
- /* teclas */
- extern struct TECLA t[NUM_TECLAS]=
- {
- /* teclas de funcion */
- { 0, 395, 79,30,OFF,"Cargar"},
- { 80, 395, 79,30,OFF,"Ver"},
- {160, 395, 79,30,OFF,"Salvar"},
- {240, 395, 79,30,OFF,"Nuevo"},
- {320, 395, 79,30,OFF,"Giro H."},
- {400, 395, 79,30,OFF,"Giro V."},
- {480, 395, 79,30,OFF,"B y N"},
- {560, 395, 79,30,OFF,"Invertir"},
- { 0, 425, 79,30,OFF,"Gris"},
- { 80, 425, 79,30,OFF,"Colores"},
- {160, 425, 79,30,OFF,"Imprimir"},
- {240, 425, 79,30,OFF,"Vision"},
- {320, 425, 79,30,OFF,"Memoria"},
- {400, 425, 79,30,OFF,"Escalar"},
- {480, 425, 79,30,OFF,"Informar"},
- {560, 425, 79,30,OFF,"Salir"},
- /* flechas directorio */
- {125, 95,20,20,OFF," \030 "},
- {125,335,20,20,OFF," \031 "},
- /* unidades de disco */
- {180,100,50,25,OFF,"A:\337\333\337"},
- {180,130,50,25,OFF,"B:\337\333\337"},
- {180,160,50,25,ON ,"C:\262\262\262"},
- /* formatos graficos */
- {156,215,90,15,OFF,"MAC"},
- {156,230,90,15,ON ,"PCX"},
- {156,245,90,15,OFF,"GIF"},
- {156,260,90,15,OFF,"TIFF"},
- {156,275,90,15,OFF,"IMG"},
- {156,290,90,15,OFF,"TGA"},
- {156,305,90,15,OFF,"BMP"},
-
- /* teclas de ficheros */
- { 40,360,80,20,OFF,"Borrar"},
- {140,360,80,20,OFF,"Renombrar"},
-
- /* teclas del menu de escalado */
- {350,250,20,20,OFF," \030 "},
- {410,250,20,20,OFF," \031 "},
- {440,250,20,20,OFF," \030 "},
- {500,250,20,20,OFF," \031 "},
- {530,240,95,30,OFF,"ACEPTAR"},
-
- /* teclas del menu de memoria */
- {265,190,120,30,ON ,"Extendida(XMS)"},
- {390,190,120,30,OFF,"Expandida(EMS)"},
- {515,190,115,30,OFF,"Virtual (VMS)"},
-
- /* teclas del menu de impresion */
- {545,100,80,30,OFF ,"IMPRIMIR"},
- {275, 85,120,30,ON ,"Epson FX 80"},
- {275,120,120,30,OFF,"PostScript"},
- {410, 85,120,30,OFF,"Fichero"},
- {410,120,120,30,ON ,"Impresora"},
-
- /* teclas del menu de Blanco y Negro */
- {290,300, 70,30,ON ,"BAYER"},
- {370,300, 70,30,OFF,"FLOYD"},
- {450,300, 70,30,OFF,"STUCKI"},
- {530,300, 70,30,OFF,"BURKES"},
-
- /* teclas del menu de confirmar */
- {460,350,80,25,OFF,"CANCELAR"},
- {550,350,80,25,ON ,"ACEPTAR"},
- };
-
- /*---- DEFINICION DE LAS FUNCIONES INTERNAS ----------------------------------*/
-
- void Cuadro(struct TECLA *t);
- void Interior(struct TECLA *t,int color);
- int leetecla(void);
-
- /*---- CODIFICACION DE LAS FUNCIONES OFRECIDAS -------------------------------*/
-
- /*---- FUNCION: extern void TECLAponer(struct TECLA *t) ------------------------
-
- Descripción:
-
- Esta función dibuja una tecla. Si está activa, la dibuja resaltada.
-
- Parámetros:
-
- Puntero a la estructura de la tecla.
-
- ---- CODIGO: -----------------------------------------------------------------*/
-
- extern void TECLAponer(struct TECLA *t)
- {
- /* dibujar cuadro */
- Cuadro(t);
- /* dibujar interior */
- if(t->e)
- Interior(t,c7);
- else
- Interior(t,c3);
- }
-
- /*---- FIN FUNCION -----------------------------------------------------------*/
-
- /*---- FUNCION: extern void TECLAresaltar(struct TECLA *t) ---------------------
-
- Descripción:
-
- Esta función resalta tecla.
-
- Parámetros:
-
- Puntero a la estructura de la tecla.
-
- ---- CODIGO: -----------------------------------------------------------------*/
-
- extern void TECLAresaltar(struct TECLA *t)
- {
- /* dibuja interior resaltado */
- Interior(t,c7);
- /* espera */
- delay(100);
- /* dibuja interior */
- Interior(t,c3);
- }
-
- /*---- FIN FUNCION -----------------------------------------------------------*/
-
- /*---- FUNCION: extern void TECLAactivar(struct TECLA *t) ----------------------
-
- Descripción:
-
- Esta función activa una tecla. Cambia su estado a activo y la dibuja
- resaltada.
-
- Parámetros:
-
- Puntero a la estructura de la tecla.
-
- ---- CODIGO: -----------------------------------------------------------------*/
-
- extern void TECLAactivar(struct TECLA *t)
- {
- /* si no está activa */
- if(!t->e)
- {
- /* activar y dibujar resaltada */
- t->e = ON;Interior(t,c7);
- }
- }
-
- /*---- FIN FUNCION -----------------------------------------------------------*/
-
- /*---- FUNCION: extern void TECLAdesactivar(struct TECLA *t) -------------------
-
- Descripción:
-
- Esta función desactiva una tecla. Cambia su estado a inactivo y la dibuja.
-
- Parámetros:
-
- Puntero a la estructura de la tecla.
-
- ---- CODIGO: -----------------------------------------------------------------*/
-
- extern void TECLAdesactivar(struct TECLA *t)
- {
- /* si está activa */
- if(t->e)
- {
- /* desactivar y dibujar */
- t->e = OFF;Interior(t,c3);
- }
- }
-
- /*---- FIN FUNCION -----------------------------------------------------------*/
-
- /*---- FUNCION: extern void MENSAJEponer(int x,int y,int ancho,char *texto)-----
-
- Descripción:
-
- Esta función escribe un mensaje sobre un rectángulo. Si el mensaje es
- mayor que el rectángulo, escribe la parte final.
-
- Parámetros:
-
- int x: coordenada izquierda del rectángulo
- int y: coordenada superior del rectángulo
- int ancho: ancho en pixels del rectángulo
- char *texto: texto a escribir
-
- ---- CODIGO: -----------------------------------------------------------------*/
-
- extern void MENSAJEponer(int x,int y,int ancho,char *texto)
- {
- /* número máximo de caracteres */
- int maximo;
-
- /* calcular máximo de caracteres */
- maximo = (ancho-5)/8;
- /* dibujar rectángulo */
- setcolor(c4);
- setfillstyle(SOLID_FILL,c4);
- bar(x,y,x+ancho-1,y+14);
- setcolor(c1);
- /* escribir texto */
- if(strlen(texto) > maximo)
- outtextxy(x+5,y+3,texto+strlen(texto)-maximo);
- else
- outtextxy(x+5,y+3,texto);
- }
-
- /*---- FIN FUNCION -----------------------------------------------------------*/
-
- /*---- FUNCION: extern void ESTADOponer(char *texto) ---------------------------
-
- Descripción:
-
- Esta función escribe un texto en la línea de estado
-
- Parámetros:
-
- char *texto: texto a escribir
-
- ---- CODIGO: -----------------------------------------------------------------*/
-
- extern void ESTADOponer(char *texto)
- {
- /* dibujar rectángulo */
- setcolor(c4);
- setfillstyle(SOLID_FILL,c4);
- bar(m[1].x+5,m[1].y+5,m[1].x+m[1].ancho-5,m[1].y+m[1].alto-5);
- setcolor(c1);
- /* escribir texto */
- outtextxy(m[1].x+10,m[1].y+5,texto);
- }
-
- /*---- FIN FUNCION -----------------------------------------------------------*/
-
- /*---- FUNCION: extern void ESTADOquitar(void) ---------------------------------
-
- Descripción:
-
- Esta función limpia la línea de estado
-
- ---- CODIGO: -----------------------------------------------------------------*/
-
- extern void ESTADOquitar(void)
- {
- TECLAponer(&m[1]);
- }
-
- /*---- FIN FUNCION -----------------------------------------------------------*/
-
- /*---- FUNCION: extern void TEXTOponer(int x,int y,char *texto)-----------------
-
- Descripción:
-
- Esta función escribe un texto sobre el fondo actual
-
- Parámetros:
-
- int x: coordenada izquierda del texto
- int y: coordenada superior del texto
- char *texto: texto a escribir
-
- ---- CODIGO: -----------------------------------------------------------------*/
-
- extern void TEXTOponer(int x,int y,char *texto)
- {
- setcolor(c2);
- outtextxy(x+1,y,texto);
- }
-
- /*---- FIN FUNCION -----------------------------------------------------------*/
-
- /*---- FUNCION: extern void TEXTOresaltar(int x,int y,int ancho,char *texto) ---
-
- Descripción:
-
- Esta función escribe un texto, resaltándolo sobre un rectángulo.
-
- Parámetros:
-
- int x: coordenada izquierda del rectángulo
- int y: coordenada superior del rectángulo
- int ancho: ancho en pixels del rectángulo
- char *texto: texto a escribir
-
- ---- CODIGO: -----------------------------------------------------------------*/
-
- extern void TEXTOresaltar(int x,int y,int ancho,char *texto)
- {
- setcolor(c2);
- setfillstyle(SOLID_FILL,c2);
- bar(x,y-2,x+ancho-1,y+10);
- setcolor(c1);
- outtextxy(x+1,y,texto);
- }
-
- /*---- FIN FUNCION -----------------------------------------------------------*/
-
- /*---- FUNCION: extern char *LeerCadena(int x,int y,int ancho,char *cad) -------
-
- Descripción:
-
- Esta función lee una cadena desde el dispositivo de entrada.
-
- Parámetros:
-
- int x: coordenada izquierda del rectángulo de lectura
- int y: coordenada superior del rectángulo de lactura
- int ancho: ancho en pixels del rectángulo de lectura
- char *cad: cadena a leer
-
- ---- CODIGO: -----------------------------------------------------------------*/
-
- extern char *LeerCadena(int x,int y,int ancho,char *cad)
- {
- /* contador de caracteres */
- int j=0;
- /* buffer de lectura */
- char p[128];
- /* copia de la cadena anterior */
- char copia[128];
- /* máximo de caracteres */
- int longitud;
-
- /* guardar copia */
- strcpy(copia,cad);
-
- /* leer longitud máxima de caracteres visibles */
- longitud = ancho/8-1;
- /* leer longitud de la cadena */
- j=strlen(cad);
- /* escribir cadena visible y cursor */
- if(j <=(longitud-2))
- {
- strcpy(p,cad);p[j]='_';p[j+1]=0;
- }
- else
- {
- strcpy(p,&cad[j-(longitud-2)]);p[longitud-2]='_';p[longitud-1]=0;
- }
- MENSAJEponer(x,y,ancho,p);
-
- while(1)
- {
- /* leer tecla o pulsación de ratón */
- evento = leer_evento(evento);
- switch(evento.e)
- {
- /* si no evento, seguir */
- case NO_EVENTO:break;
- /* si botón derecho o ESCAPE salir y devolver sin cambiar */
- case RATON_DCHO_ON:
- case ESC:MENSAJEponer(x,y,ancho,copia);return(copia);
- /* si botón izquierdo o INTRO, devolver cambiada */
- case RATON_IZDO_ON:
- case RET:MENSAJEponer(x,y,ancho,cad);return(cad);
- /* si backspace, borrar caracter anterior */
- case DEL:if(j>0)cad[--j]=0;break;
- /* en otro caso */
- default:
- /* si es un carácter imprimible, añadirlo a la cadena */
- if(isprint(evento.e) && !isspace(evento.e))
- if(j<(MAXPATH-1))
- {
- cad[j++] = evento.e;cad[j]=0;
- }
- break;
- }
-
- /* pintar cadena actual y cursor */
- if(j <=(longitud-2))
- {
- strcpy(p,cad);p[j]='_';p[j+1]=0;
- }
- else
- {
- strcpy(p,&cad[j-(longitud-2)]);p[longitud-2]='_';p[longitud-1]=0;
- }
- MENSAJEponer(x,y,ancho,p);
- }
- }
-
- /*---- FIN FUNCION -----------------------------------------------------------*/
-
- /*---- FUNCION: extern struct EVENTO leer_evento(struct EVENTO evento) ---------
-
- Descripción:
-
- Esta función devuelve un evento leido. Se entiende por evento, una
- pulsación de una tecla o botón del ratón.
-
- Parámetros:
-
- struct EVENTO evento: evento a leer
-
- Retorno:
-
- evento leido
-
- ---- CODIGO: -----------------------------------------------------------------*/
-
- extern struct EVENTO leer_evento(struct EVENTO evento)
- {
- /* inicializa evento */
- evento.e = NO_EVENTO;
- /* leer hasta que se produzca el evento */
- for(;evento.e==NO_EVENTO;)
- {
- /* retardo */
- delay(100);
- /* testear si se ha pulsado una tecla */
- evento.e = bioskey(1);
- /* si se pulsó, leerla */
- if(evento.e != 0)
- {
- /* el evento es el código de la tecla */
- evento.e = leetecla();
- switch(evento.e)
- {
- /* si es una tecla usada por el programa, terminar */
- case ARRIBA:
- case ABAJO:
- case IZQ:
- case DER:
- case ORIGEN:
- case FIN:
- case PGARR:
- case PGABJ:
- case BORRAR:
- case INSERT:
- case ESC:
- case DEL:
- case RET:break;
-
- /* si no es usada por el programa, devolver no evento */
- case F1: case F2: case F3: case F4: case F5:
- case F6: case F7: case F8: case F9: case F10:
- default:
- if(!isprint((char)evento.e))
- evento.e = NO_EVENTO;
- break;
- };
- }
- else
- /* comprobar si se pulsó botón del raton */
- if(!(evento.e = RATONestadoPulsar(RATON_IZDO,&(evento.x),&(evento.y))))
- evento.e = RATONestadoPulsar(RATON_DCHO,&(evento.x),&(evento.y));
- }
- /* devolver evento */
- return(evento);
- }
-
- /*---- FIN FUNCION -----------------------------------------------------------*/
-
- /*---- FUNCION: extern int TestTecla(int x,int y) ------------------------------
-
- Descripción:
-
- Esta función detecta si las coordenadas x,y se encuentran dentro de un
- area o tecla.
-
- Parámetros:
-
- int x: coordenada x
- int y: coordenada y
-
- Retorno:
-
- Si corresponden a una tecla, devuelve su número (definido en OPCIONES)
- Si corresponden a un area, devuelve su opción (definido en OPCIONES)
- Si no corresponden a ninguno, devuelve NOOPC
-
- ---- CODIGO: -----------------------------------------------------------------*/
-
- extern int TestTecla(int x,int y)
- {
- int i;
-
- if(x<0)
- return(NOOPC);
- /* comprobar si están dentro de una tecla */
- for(i=0;i<NUM_TECLAS;i++)
- {
- if( (y >= t[i].y) &&
- (y < t[i].y+t[i].alto) &&
- (x >= t[i].x) &&
- (x < t[i].x+t[i].ancho)
- )
- return(i);
- }
- /* comprobar areas sensibles del menu */
- /* lista de ficheros y directorios */
- if((x > 15) && (x < 125) && (y > 95) && (y < 349))
- return(OPlista);
- /* fichero de acción principal */
- if((x > 17) && (x < 241) && (y > 61) && (y < 77))
- return(OPfichero);
- /* lectura de cadena en el menu de confirmar */
- if((x > 270) && (x < 430) && (y > 360) && (y < 376))
- return(OPficheroDOS);
-
- return(NOOPC);
- }
-
- /*---- FIN FUNCION -----------------------------------------------------------*/
-
- /*---- CODIFICACION DE LAS FUNCIONES INTERNAS --------------------------------*/
-
- /*---- FUNCION: void Cuadro(struct TECLA *t) -----------------------------------
-
- Descripción:
-
- Esta función dibuja el borde exterior de una tecla
-
- Parámetros:
-
- struct TECLA *t: puntero a la tecla
-
- ---- CODIGO: -----------------------------------------------------------------*/
-
- void Cuadro(struct TECLA *t)
- {
- int register l,a,b = 3;
- a = t->ancho-1;
- l = t->alto-1;
-
- setcolor(c1);
- moveto(t->x,t->y);
- linerel(a,0);linerel(-b,b);
- linerel(-(a-2*b),0);linerel(0,l-2*b);
- linerel(-b,b);linerel(0,-l);
- setfillstyle(SOLID_FILL,c1);
- floodfill(t->x+1,t->y+1,c1);
-
- setcolor(c4);
- moveto(t->x+a,t->y);
- linerel(0,l);linerel(-a,0);
- linerel(b,-b);linerel(a-2*b,0);
- linerel(0,-(l-2*b));linerel(b,-b);
- setfillstyle(SOLID_FILL,c4);
- floodfill(t->x+a-1,t->y+l-1,c4);
- }
-
- /*---- FIN FUNCION -----------------------------------------------------------*/
-
- /*---- FUNCION: void Interior(struct TECLA *t,int color) -----------------------
-
- Descripción:
-
- Esta función dibuja el interior de una tecla con un color dado
-
- Parámetros:
-
- struct TECLA *t: puntero a la tecla
- int color: color de la tecla
-
- ---- CODIGO: -----------------------------------------------------------------*/
-
- void Interior(struct TECLA *t,int color)
- {
- int register l,a,b = 3;
- a = t->ancho-1;
- l = t->alto-1;
-
- setcolor(color);
- setfillstyle(SOLID_FILL,color);
- bar(t->x+b,t->y+b,t->x+(a-b),t->y+l-b);
-
- setcolor(c2);
- setfillstyle(SOLID_FILL,c2);
- outtextxy(t->x+(a-textwidth(t->texto))/2,t->y+(l-8)/2,t->texto);
- }
-
- /*---- FIN FUNCION -----------------------------------------------------------*/
-
- /*---- FUNCION: int leetecla(void) ---------------------------------------------
-
- Descripción:
-
- Esta función lee una tecla del teclado.
-
- Retorno:
-
- - Si la tecla es normal (código ASCII), la devuelve como tal,
- con un valor menor a 256.
- - Si es una tecla especial, el código supera 256.
- ---- CODIGO: -----------------------------------------------------------------*/
-
- int leetecla(void)
- {
- int tecla,baja,alta,salida;
-
- /* leer tecla */
- tecla = bioskey(0);
- /* guardar código ASCII */
- baja = tecla & 0x00ff;
- /* guardar tecla especial */
- alta = (tecla & 0xff00) >> 8;
- /* devolver ASCII o especial */
- salida = ((baja==0) ? alta+256:baja);
- return(salida);
- }
-
- /*---- FIN FUNCION -----------------------------------------------------------*/
-